rawset(_G, "cv_nipah", CV_RegisterVar({
	name = "nipah",
	defaultvalue = "Off",
	flags = CV_NETVAR,
	PossibleValue = {Off = 0, On = 1},
}))

rawset(_G, "cv_rikas", CV_RegisterVar({
	name = "rikas",
	defaultvalue = "0",
	flags = CV_NETVAR,
	PossibleValue = {MIN = 0, MAX = 10000},
}))

freeslot("spr_rika","sfx_nipah1","sfx_nipah2","sfx_nipah3","sfx_nipah4","sfx_nipah5","sfx_nipaah",
		 "spr_stky","sfx_satoky","mt_rika", "s_rika")

local nipah = {sfx_nipah1,sfx_nipah2,sfx_nipah3,sfx_nipah4,sfx_nipah5}
local sounds = {sfx_jump,sfx_zoom,sfx_spin,sfx_spndsh,sfx_thok,sfx_pudpud,sfx_putput,sfx_boingf,sfx_corkp,sfx_ncchip,sfx_ncitem,sfx_nxitem,sfx_drill1,sfx_drill2,sfx_hoop1,sfx_hoop2,sfx_hoop3,sfx_prloop,sfx_ngjump,sfx_s3k65}
local hurts = {sfx_altow1,sfx_altow2,sfx_altow3,sfx_altow4,sfx_altdi1,sfx_altdi2,sfx_altdi3,sfx_altdi4}

sfxinfo[sfx_nipah1].caption = '\x84\"Nipah!"\x80'
sfxinfo[sfx_nipah2].caption = '\x84\"Nipah!"\x80'
sfxinfo[sfx_nipah3].caption = '\x84\"Nipah!"\x80'
sfxinfo[sfx_nipah4].caption = '\x84\"Nipah!"\x80'
sfxinfo[sfx_nipah5].caption = '\x84\"Nipah!"\x80'
sfxinfo[sfx_nipaah].caption = '\x84\"Nipaaah..."\x80'
sfxinfo[sfx_satoky].caption = '\x82\"Oooohohoho!"\x80'

mobjinfo[MT_RIKA] = {
	doomednum = -1,
	spawnhealth = 999999,
	shadowscale = 16*FRACUNIT,
	spawnstate = S_RIKA,
	painstate = S_RIKA,
	radius = 16*FRACUNIT,
	height = 64*FRACUNIT,
	flags = MF_NOCLIP|MF_NOCLIPTHING|MF_SCENERY
}

states[S_RIKA] = {
	sprite = SPR_RIKA,
	frame = A,
	tics = -1,
	nextstate = S_RIKA
}

addHook("PlayerThink",function(p)
	if not p.rikad then return end
	if mapheaderinfo[gamemap].nipah or cv_nipah.value == 1 then return end
	local skin = skins[p.mo.skin]
	p.mo.spritexscale = FRACUNIT
	p.mo.spriteyscale = FRACUNIT
	p.mo.sprite = SPR_PLAY
	p.rikad = nil
	
	if skin.thokitem == -1 then
		p.thokitem = MT_THOK
	else
		p.thokitem = skin.thokitem
	end
	
	if skin.followitem == -1 then
		p.followitem = MT_THOK
	else
		p.followitem = skin.followitem
	end
	
	if skin.spinitem == -1 then
		p.spinitem = MT_THOK
	else
		p.spinitem = skin.spinitem
	end
	
end)

addHook("PostThinkFrame", do
	if not mapheaderinfo[gamemap].nipah and cv_nipah.value != 1 then return end
	for p in players.iterate do
		if p.mo and p.valid then
			p.rikad = true
			p.followitem = 0
			p.thokitem = 0
			p.spinitem = 0
			p.mo.sprite = SPR_RIKA
			p.mo.frame = 0
			p.mo.spritexscale = FixedDiv(FRACUNIT,skins[p.mo.skin].highresscale)/5
			p.mo.spriteyscale = FixedDiv(FRACUNIT,skins[p.mo.skin].highresscale)/5
			if p.mo.nipah then
				if p.mo.nipah > 5 then
					p.mo.frame = 1
				end
				p.mo.nipah = $-1
			else
				if P_RandomRange(1,50) == 1 and not P_PlayerInPain(p) and p.playerstate != PST_DEAD then
					S_StartSound(p.mo,nipah[P_RandomRange(1,5)])
					p.mo.frame = 0
					p.mo.nipah = 40
				end
			end
			for k, t in pairs(sounds)
				if S_SoundPlaying(p.mo,t) then
					S_StopSoundByID(p.mo,t)
					for k, t in pairs(nipah)
						S_StopSoundByID(p.mo,t)
					end
					if not P_PlayerInPain(p) and p.playerstate != PST_DEAD
						S_StartSound(p.mo,nipah[P_RandomRange(1,5)])
						p.mo.frame = 0
						p.mo.nipah = 40
					end
				end
			end
			for k, t in pairs(hurts)
				if S_SoundPlaying(p.mo,t) then
					S_StopSoundByID(p.mo,t)
					for k, t in pairs(nipah)
						S_StopSoundByID(p.mo,t)
					end
					S_StartSound(p.mo,sfx_nipaah)
					p.mo.frame = 2
				end
			end
			if S_SoundPlaying(p.mo,sfx_itemup) then
				S_StopSoundByID(p.mo,sfx_itemup)
				S_StopSoundByID(p.mo,sfx_satoky)
				S_StartSoundAtVolume(p.mo,sfx_satoky,150)
			end
			if P_PlayerInPain(p) or p.playerstate == PST_DEAD then
				p.mo.frame = 2
			end
		end
	end
end)

addHook("MapLoad", function(map)
	if map != 101 then return end
	
	if cv_rikas.value then
		local rika
		for i = 1,cv_rikas.value do
			rika = P_SpawnMobj(0,0,0,MT_RIKA)
			rika.spritexscale = FRACUNIT/5
			rika.spriteyscale = FRACUNIT/5
			P_TryMove(rika,P_RandomRange(-10000,10000)<<16,P_RandomRange(-10000,10000)<<16,false)
		end
	end
	
end)

addHook("MobjThinker", function(mo)
	mo.frame = 0
	mo.spritexscale = FRACUNIT/5
	mo.spriteyscale = FRACUNIT/5
	if mo.nipah then
		if mo.nipah > 5 then
			mo.frame = 1
		end
		mo.nipah = $-1
	else
		if P_RandomRange(1,50) == 1 then
			S_StartSound(mo,nipah[P_RandomRange(1,5)])
			mo.frame = 0
			mo.nipah = 40
		end
	end
	
	if abs(mo.floorz - mo.ceilingz) < mo.height then
		P_TryMove(mo,P_RandomRange(-10000,10000)<<16,P_RandomRange(-10000,10000)<<16,false)
	end
	
end,MT_RIKA)

addHook("MobjThinker", function(mo)
	if not mapheaderinfo[gamemap].nipah and cv_nipah.value != 1 then return end
	
	mo.sprite = SPR_STKY
	mo.angle = $+ANG10
	if mo.state != S_RING then
		local satoky = P_SpawnGhostMobj(mo)
		satoky.frame = 1|FF_TRANS50
		satoky.renderflags = RF_FULLBRIGHT
		satoky.blendmode = AST_ADD
		satoky.destscale = 2*FRACUNIT
		mo.state = S_NULL
	else
		mo.frame = 0|FF_PAPERSPRITE
		mo.spritexscale = FRACUNIT/5
		mo.spriteyscale = FRACUNIT/5
	end

end,MT_RING)

addHook("MobjThinker", function(mo)
	if not mapheaderinfo[gamemap].nipah and cv_nipah.value != 1 then return end
	
	mo.sprite = SPR_STKY
	mo.angle = $+ANG10
	if mo.state != S_RING then
		local satoky = P_SpawnGhostMobj(mo)
		satoky.frame = 1|FF_TRANS50
		satoky.renderflags = RF_FULLBRIGHT
		satoky.blendmode = AST_ADD
		satoky.destscale = 2*FRACUNIT
		mo.state = S_NULL
	else
		mo.frame = 0|FF_PAPERSPRITE
		mo.spritexscale = FRACUNIT/5
		mo.spriteyscale = FRACUNIT/5
	end

end,MT_FLINGRING)

local function nipah(v, p)
    if not mapheaderinfo[gamemap].nipah and cv_nipah.value != 1 then return end
	if not hud.enabled("lives") then return end
	if p.powers[pw_carry] == CR_NIGHTSMODE then return end
	v.drawScaled(16*FRACUNIT,176*FRACUNIT,FRACUNIT/14,v.cachePatch("RIKLIFE"),V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS)--rika
end

hud.add(nipah, "game")